如果我通过将其分配给一些外部强引用而走私self
了我会发生什么deinit
?下面的代码显然格式不正确:
class C: CustomStringConvertible { let s = "abc" var description: String { return "C(id: \(ObjectIdentifier(self)), s: \(s))" } deinit { print("deinit") globalObject = self } } var globalObject: C! do { let localObject = C() print("localObject: \(localObject)") print("end of `do`") } print("globalObject: \(globalObject!)")
您不能仅仅从a的中间“改变主意”来取消对象的初始化deinit
。但有趣的是,此代码是不确定的,有时偶尔会成功完成,并打印:
localObject: C(id: ObjectIdentifier(0x00007f9063f00960), s: abc) end of `do` deinit globalObject: C(id: ObjectIdentifier(0x00007f9063f00960), s: abc)
我正在使用Code Runner运行此程序,后者仅使用运行单个文件Swift脚本swiftc
。因此,这里没有任何Playground拥有的意外参考。
不确定性从何而来?